/*
* 装饰器 : 本质上是一个方法 : 实现性功能
*
* 装饰器是一中特殊的类型声明 就可以被附加到 类声明 方法 属性上 参数上
*
* 在不改变原方法的基础上 可以扩展原来方法的功能
*
* */
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
    return function (target, key) { decorator(target, key, paramIndex); }
};
function AddAge(constructor) {
    // 类.prototype.age
    constructor.prototype.age = 18;
    constructor.prototype.setAge = function () {
        constructor.prototype.age = 20;
    };
}
// Object.defineProperty({a:12},'a',{
//   writable: false
// })
function Post(params) {
    console.log(params);
    // target : 类的实例
    //property 此实例当前的方法
    // descriptor : undefined
    return function (target, property, descriptor) {
        console.log(target);
        console.log(property);
        console.log(descriptor);
        // target[property]()
    };
}
function Property() {
    // 实例本身
    // 属性的值
    return function (target, propertyKey) {
        console.log(target);
        console.log(propertyKey);
    };
}
/* 装饰参数的装饰器 */
function Query() {
    /*target 类的实例 propertyKey:方法的名字 参数的位置*/
    return function (target, propertyKey, index) {
        console.log('Query', target);
        console.log('Query', propertyKey);
        console.log('Query', index);
    };
}
// @AddAge就是装饰器 装饰 Person
var Person1 = /** @class */ (function () {
    function Person1() {
        this.name = '123';
    }
    Person1.prototype.setAge = function () {
    };
    Person1.prototype.setName = function (a, type, name) {
        console.log(name, type, a);
    };
    __decorate([
        Property()
    ], Person1.prototype, "name");
    __decorate([
        Post('/url'),
        __param(2, Query())
    ], Person1.prototype, "setName");
    Person1 = __decorate([
        AddAge
    ], Person1);
    return Person1;
}());
var person = new Person1();
person.setAge();
console.log(person.age);
// let a: symbol = Symbol('12');
//
// let promise: Promise<number> =
//   new Promise<number>((resolve) => {
//   resolve(123)
// })
/*
* 装饰器装饰类 : 在装饰器里面把当做参数 只有一个参数
* 装饰器装饰方法 : 3个参数  实例,方法名字,属性描述符
*
* */
